/*
 * CalculadorDePesosNormalizados.cpp
 *
 *  Created on: 11/09/2011
 *      Author: leonel
 */

#include "CalculadorDePesosNormalizados.h"

//Constructor
CalculadorDePesosNormalizados::CalculadorDePesosNormalizados(){
//	this->pesoGlobalNormalizado = 0.0;
}

//carga el peso normalizado del termino en el respectivo RegistroDePesosNormalizados
//float CalculadorDePesosNormalizados::cargarFrecuenciasNormalizada(list<RegistroDePesosNormalizados> listaDeRegNorm){
//
//}


/* Metodo que recibe una lista de lista de terminos de c/arch, un objeto listaInvertida, y la cantidad total
 *  actual de archivos */
//float CalculadorDePesosNormalizados::setPesoGlobal(list< listaDeRegPalabras > ll,ListaInvertida l_invertida,int cantArchTotales){
//	float global = 0.0;
//	float particular = 0.0;
//	int posicionDelTermino;
//	int n; // el n chiquita para el calculo del peso normalizado del termino
//	// preparo para ir recorriendo la lista de lista
//
//	list< listaDeRegPalabras >::iterator iter_listDElist; // iterador de lista de lista
//	list< RegistroPalabra >::iterator iter_listInterna;
//	iter_listDElist = ll.begin();
//	iter_listInterna = (*iter_listDElist).begin();
//
////	int cantDeDocEnLosQueAparece = listaDeRegNorm.size(); // n
//
//	for(iter_listDElist = ll.begin();iter_listDElist != ll.end();iter_listDElist++){
//
//       for (iter_listInterna = (*iter_listDElist).begin();iter_listInterna != (*iter_listDElist).end();iter_listInterna++){
//    	   // voy buscando termino por termino
//    	   posicionDelTermino = l_invertida.buscarTermio((*iter_listInterna).getPalabra());
//    	   n = l_invertida.getCantidadDeDocEnLosQueAparece(posicionDelTermino);
//
//    	   particular = (float)(*iter_listInterna).getRepeticiones() * (float)log10(cantArchTotales/n);
//           global = global + pow(particular,2.0);
//
//       }
//       // ahora le tomo raiz
//
//	}
//
//
//}




// le paso una referencia a la lista de lista devido a que esta puede llegar a ser muy pesada
// setea pesos y a estos luego hay que normalizarlos
void CalculadorDePesosNormalizados::setearPesos(list< listaDeRegPalabras >* &ll, int cantArchTotales){
	list< listaDeRegPalabras >::iterator iter_listDElist; // iterador de lista de lista
	list< RegistroPalabra >::iterator iter_listInterna;
	iter_listDElist = ll->begin();
	iter_listInterna = (*iter_listDElist).begin();
	int n;
	float peso = 0.0;
	for(iter_listDElist = ll->begin();iter_listDElist != ll->end();iter_listDElist++){

       for (iter_listInterna = (*iter_listDElist).begin();iter_listInterna != (*iter_listDElist).end();iter_listInterna++){
    	   // por cada termino tengo que ver en todos los doc en los que aparece
    	  n = this->contarDocEnLosQueAparece((*iter_listInterna).getPalabra(),ll);
    	  peso = (*iter_listInterna).getRepeticiones() * (float)log10((float)cantArchTotales/(float)n);
    	  (*iter_listInterna).setPeso(peso);

       }
    }
}

// le paso una referencia a la lista de lista devido a que esta puede llegar a ser muy pesada
// se encarga de ver en todos los doc en los que aparece el termino: termino
int CalculadorDePesosNormalizados::contarDocEnLosQueAparece(string termino, list< listaDeRegPalabras >* &ll){
	list< listaDeRegPalabras >::iterator iter_listDElist; // iterador de lista de lista
	list< RegistroPalabra >::iterator iter_listInterna;
	iter_listDElist = ll->begin();
	iter_listInterna = (*iter_listDElist).begin();
	int cantDeDocEnLosQueAparece = 0; // n
	for(iter_listDElist = ll->begin();iter_listDElist != ll->end();iter_listDElist++){

       for (iter_listInterna = (*iter_listDElist).begin();iter_listInterna != (*iter_listDElist).end();iter_listInterna++){
    	   // ahora entro en cada registro y voy comparando hasta que lo encuentro ó hasta fin de lista
    	   string palab = (*iter_listInterna).getPalabra();
    	   if(termino == palab){
    		   cantDeDocEnLosQueAparece++;
//    		   int longDeLista = (*iter_listDElist).size();
    		   iter_listInterna = (*iter_listDElist).end();
    		   iter_listInterna --;
    	   }
       }

     }
    return cantDeDocEnLosQueAparece;
}


//recibe una referencia a la lista de lista devido a que esta puede llegar a ser muy pesada
// una ves que estan seteados los pesos este metodo se encarga de normalizarlos
void CalculadorDePesosNormalizados::normalizarPesos(list< listaDeRegPalabras >* &ll){
	list< listaDeRegPalabras >::iterator iter_listDElist; // iterador de lista de lista
	list< RegistroPalabra >::iterator iter_listInterna;
	iter_listDElist = ll->begin();
	iter_listInterna = (*iter_listDElist).begin();
	float norma = 0.0;
	for(iter_listDElist = ll->begin();iter_listDElist != ll->end();iter_listDElist++){

		//acá calculo la norma
	   for (iter_listInterna = (*iter_listDElist).begin();iter_listInterna != (*iter_listDElist).end();iter_listInterna++){
		   norma = norma + pow((*iter_listInterna).getRepeticiones(),2.0);
	   }
	   norma = sqrt(norma); // le tomo raiz cuadrada
	   // ahora los seteo normalizados a cada uno de los terminos de la lista
	   for (iter_listInterna = (*iter_listDElist).begin();iter_listInterna != (*iter_listDElist).end();iter_listInterna++){
		   (*iter_listInterna).setPeso((*iter_listInterna).getRepeticiones() / norma);
	   }
	   norma = 0.0; //la inicializo para el proximo doc
	}
}

CalculadorDePesosNormalizados::~CalculadorDePesosNormalizados() {
	// TODO Auto-generated destructor stub
}
